package com.example.demo;

/**
 * 目标：开发验证码。
 */
public class Test3 {
    public static void main(String[] args) {
        // 1.调用一个方法返回执行位数的验证码，每位只能是数字或者大写字母或者小写字母
        System.out.println(getCode(4));
        System.out.println(getCode(6));
    }

    /*
    思路分析：
    1.先定义一共循环，确定生成几位验证码
    2.制定规则 随机生成0 1 2 三个数字 如果是0，则生成数字，如果是1，则生成大写字母，如果是2，则生成小写字母
    3.如果随机数为0 就生成 0-9之间的数字 然后拼接到code中
    4.如果随机数为1 就生成 A-Z之间的大写字母 然后拼接到code中
      注意：生成大写字母和小写字母的方法 先生成0-25之间的数字 然后加上65 或者 加上 'a' 即可。
           生成小写字母的方法 先生成0-25之间的数字 然后加上97 或者 加上 'A' 即可。
    5.最后返回验证码
     */
    public static String getCode(int n) {
        // 2.定义一个字符串变量用于记录生产的验证码。
        String code = "";
        // 3.循环n次，每次生成一个验证码。
        for (int i = 0; i < n; i++) {
            // i = 0 1 2 3
            // 4.为当前位置随机生成一个数字或者大写字母或者小写字母。 数字0 / 大写1 / 小写2
            // 随机一个 0 或者 1 或者 2 表示当前位置随机的字符类型。
            int type = (int) (Math.random() * 3);  // [0,1) * 3 => 0 1 2
            // 5.使用switch判断当前位置随机的字符类型
            switch (type) {
                case 0:
                    // 6.如果当前位置是数字，则随机生成一个数字0-9，然后拼接。
                    int num = (int) (Math.random() * 10);
                    code += num;
                    break;
                case 1:
                    // 7.如果当前位置是大写字母，则随机生成一个字母A-Z，然后拼接。     'A' 65    'Z' 65+25
                    int num1 = (int) (Math.random() * 26); // 生成 [0,25]
                    char ch = (char) ('A' + num1); // 得到大写字母的随机编号，转成大写字母
                    code += ch;
                    break;
                case 2:
                    // 8.如果当前位置是小写字母，则随机生成一个字母a-z，然后拼接。    'a' 97    'z' 97+25
                    int num2 = (int) (Math.random() * 26); // 生成 [0,25]
                    char ch1 = (char) ('a' + num2);
                    code += ch1;
                    break;
            }
        }

        return code;
    }
}
